#ifndef SQLIST_H__
#define SQLIST_H__

#include "Status.h"


#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10

typedef int ElemType;

typedef Boolean compare_op(void *,void *);
typedef void visit_op(void *);


typedef struct 
{
    ElemType * elem;
    int length;
    int listsize;
} SqList;

/**
 * 
 * 构造一个空的线性表
*/
Status InitList(SqList *L);

/**
 * 
 * 销毁线性表
*/
Status DestroyList(SqList *);

/**
 * 
 * 将L为空表
*/
Status ClearList(SqList *);


/**
 * 
 * 若L为空表，则返回TRUE，否则返回FALSE
*/
Boolean ListEmpty(SqList *);


/**
 * 返回线性表中元素个数
*/
int ListLength(SqList );


/**
 * 用ElemType返回线性表中第i个元素的值
*/
Status GetElem(SqList ,int ,ElemType *);


/**
 * 返回线性表中第1一个与出入ElemType满足关系compare_op的数据元素的位序。若这样的元素不存在，则返回值为0
*/
int LocateElem(SqList ,ElemType ,compare_op *);


/**
 * 若 cur_e是的数据元，且不是第一个，则用 pre_e返回它的前驱，否则操作失败,pre_e无定义。
*/
Status PriorElem(SqList L,ElemType cur_e,ElemType *pre_e);



/**
 * 若 cur_e是L的数据元素，且不是最后一个,则用next_e 返回它的后，否则操作失败,next_e无定义。
*/
Status NextElem(SqList L,ElemType cur_e,ElemType *next_e);


/**
 * 在L中第i个位置之前插入新的数据元素e，L的长度加1
*/
Status ListInsert(SqList *L,int i,ElemType e);


/**
 * 删除L的第i个数据元素，并用e返回其值，L的长度减1
*/
Status ListDelete(SqList *L,int i,ElemType *e);


/**
 * 依次对L的每个数据元素调用函数 visit()，一旦visit()失败，则操作失败
*/
void ListTraverse(SqList L,visit_op *);

#endif